package com.wshoto.ocean.service.client;

import com.wshoto.framework.common.base.*;
import com.wshoto.ocean.feign.client.*;
import com.wshoto.ocean.feign.common.dto.*;
import com.wshoto.ocean.feign.common.request.*;
import com.wshoto.ocean.service.client.service.*;
import lombok.extern.slf4j.*;
import org.springframework.web.bind.annotation.*;

import javax.annotation.*;

/**
 * 示例Feign接口实现
 * Feign接口提供方负责实现该Feign,调用方无需做实现，直接引入抽取的Feign包调用即可
 * Feign接口实现命名规则:Feign后缀变前缀，后缀为Controller,即Feign+业务名+Controller
 * Feign接口实现层只承载入参校验及接口暴漏及数据返回，不承载任何业务逻辑
 * 不必在Feign接口实现中捕获任何异常，所有异常均通过全局异常拦截捕获并返回相应的状态码及错误消息,包括参数校验异常也不必捕获处理，均会通过全局异常拦截捕获处理
 * 不必在Feign接口实现中定义访问路径等，均在提取的Feign接口包中定义好
 *
 * @author Lee
 */
@Slf4j
@RestController
public class FeignAppController implements AppServiceFeign {

    /**
     * 业务逻辑层依赖注入，bean注入统一使用Resource注入，如有需要可以使用getter/setter或构造器注入,不推荐使用@Autowired注入
     */
    @Resource
    private FeignAppService feignAppService;


    /**
     * 多参数有返回值示例
     * 返回值类型统一为Result<DTO>类型，返回值调用ResultUtils.success(obj)进行封装，只对载荷部分进行序列化
     * 与API接口定义不同，Api接口是用与前端调用，因此返回完整的Json字符串即可
     * 而Feign接口是用于服务端调用，虽然最终的数据结构一致，但如此定义会使得调用方少解析一层数据，方便使用
     * 参数接收方式为Json请求接收，@RequestBody
     *
     * @param appReq
     * @return
     * @Validated校验参数，校验结果会通过全局异常拦截返回,不必做任何处理
     */
    @Override
    public Result<AppInfoListDTO> getApps(AppReq appReq) {
        return ResultUtils.success(feignAppService.getApps(appReq));
    }

    /**
     * 单参数有返回值示例
     * 返回值类型统一为Result<DTO>类型，返回值调用ResultUtils.success(obj)进行封装，只对载荷部分进行序列化
     * 与API接口定义不同，Api接口是用与前端调用，因此返回完整的Json字符串即可
     * 而Feign接口是用于服务端调用，虽然最终的数据结构一致，但如此定义会使得调用方少解析一层数据，方便使用
     * 参数接收方式为路径接收，Restfull风格url
     *
     * @param appId
     * @return
     */
    @Override
    public Result<AppInfoDTO> getAppById(Long appId) {
        return ResultUtils.success(feignAppService.getAppById(appId));
    }

    /**
     * 多参数无返回值示例
     * 返回值类型统一为Result<String>类型，执行完业务逻辑层代码直接返回ResultUtils.success()
     * 与API接口定义不同，Api接口是用与前端调用，因此返回完整的Json字符串即可
     * 而Feign接口是用于服务端调用，虽然最终的数据结构一致，但如此定义会使得调用方少解析一层数据，方便使用
     * 参数接收方式为Json请求接收，@RequestBody
     *
     * @param appRegisterReq
     * @return
     * @Validated校验参数，校验结果会通过全局异常拦截返回,不必做任何处理
     */
    @Override
    public Result<String> appRegister(AppRegisterReq appRegisterReq) {
        feignAppService.appRegister(appRegisterReq);
        return ResultUtils.success();
    }

    /**
     * 单参数无返回值示例
     * 返回值类型统一为Result<String>类型，执行完业务逻辑层代码直接返回ResultUtils.success()
     * 与API接口定义不同，Api接口是用与前端调用，因此返回完整的Json字符串即可
     * 而Feign接口是用于服务端调用，虽然最终的数据结构一致，但如此定义会使得调用方少解析一层数据，方便使用
     * 参数接收方式为路径接收，Restfull风格url
     *
     * @param appId
     * @return
     */
    @Override
    public Result<String> deleteApp(Long appId) {
        feignAppService.deleteApp(appId);
        return ResultUtils.success();
    }

}
